﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using WebArchivosTelefonica.Jerarquias;
using System.Drawing;
using System.Web.Profile;
using System.Collections.Generic;


namespace WebArchivosTelefonica
{
    /// <summary>
    /// Pagina de la aplicacion hace el papel de entidad superior que crea y administra las demas entidades
    /// </summary>
    public partial class Archivos : System.Web.UI.Page
    {
        #region CAMPOS

        private IAdministrador _administrador; //Administrador de la aplicacion
        private IFabricaLinqDataSource _fabricaLinqDataSource; //Fabrica de linq data souyrce
        //private LinqDataSource _linqDataSourceSitios;// LinqDataSource de sitios
        //private LinqDataSource _linqDataSourceCandidatos;// Linq data source de los candidatos
        private LinqDataSource _linqDataSourceClientes; //Linq data source de los clientes

        #endregion

        #region PAGE LOAD

        /// <summary>
        /// Page load de la pagina se realiza con cada postback
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {

            Navegacion1.PestañaSeleccionada = 0;
            _fabricaLinqDataSource = new FabricaLinqDataSource();

            //Se pasa el administrador a cada uno de los controles de manejo de archivos
            if (_fabricaLinqDataSource != null)
            {
                EntidadLinqDataContext contexto = new EntidadLinqDataContext();
                _administrador = new Administrador(_fabricaLinqDataSource, contexto);
            }
            //Si la pagina es postback se obtienen los ids de candidato y de sitio y se obtienen los datasources correspondientes
            if (!Page.IsPostBack)
            {

                string stringIdCliente = Request.Params["idCliente"];
                string stringIdSitio = Request.Params["idSitio"];
                string stringIdCandidato = Request.Params["idCandidato"];
                string stringIdProyecto = Request.Params["idProyecto"];

                if (stringIdCliente != null)
                {
                    string clienteId = ObtenerIdCliente((HttpContext.Current.Profile as ProfileBase));
                    if (clienteId != string.Empty)
                    {
                        if (clienteId == stringIdCliente)
                        {
                            ObtenerDataSourcesPagina(stringIdCliente, stringIdProyecto, stringIdSitio, stringIdCandidato);
                        }
                    }
                    else
                    {
                        ObtenerDataSourcesPagina(stringIdCliente, stringIdProyecto, stringIdSitio, stringIdCandidato);
                    }

                }
                else
                {
                    ObtenerDataSourceClientes();
                    Response.Redirect("Archivos.aspx?idCliente=" + dropDownListClientes.SelectedValue);
                }

					 
            }
        }

        /// <summary>
        /// Obtiene los datasource de la pagina
        /// </summary>
        /// <param name="stringIdCliente">Identificador del cliente</param>
        /// <param name="stringIdProyecto">Identificador del proyecto</param>
        /// <param name="stringIdSitio">Identificador del sitio</param>
        /// <param name="stringIdCandidato">Identificador del candidato</param>
        private void ObtenerDataSourcesPagina(string stringIdCliente, string stringIdProyecto, string stringIdSitio, string stringIdCandidato)
        {
            ObtenerDataSourceClientes();
            if (stringIdCliente != null)
            {

                ListItem cliente = dropDownListClientes.Items.FindByValue(stringIdCliente);
                if (cliente != null)
                    dropDownListClientes.SelectedValue = stringIdCliente;

                ObtenerDataSourceProyectos(stringIdCliente);

                ListItem proyecto = dropDownListProyectos.Items.FindByValue(stringIdProyecto);
                if (proyecto != null)
                    dropDownListProyectos.SelectedValue = stringIdProyecto;

                ObtenerDataSourceSitios(stringIdProyecto);
                if (stringIdSitio != null)
                {
                    dropDownListSitios.SelectedValue = stringIdSitio;
                    ObtenerDataSourceCandidatos(stringIdSitio, stringIdProyecto);
                    if (stringIdCandidato != null)
                    {
                        dropDownListCandidatos.SelectedValue = stringIdCandidato;

                    }
                }
                if (stringIdCandidato != null && stringIdCandidato != "- - -")
                {
                    ObtenerDataSourceArchivosUpload(stringIdCandidato, stringIdProyecto, stringIdCliente);
                }
            }
        }

        #endregion

        #region METODOS PROTECTED

        /// <summary>
        /// Sucede cuando se cambia el item seleccionado de clientes 
        /// se tiene que cambiar el datasource de carpetas y documentos
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void dropDownListClientes_SelectedIndexChanged(object sender, EventArgs e)
        {
            Response.Redirect("Archivos.aspx?idCliente=" + dropDownListClientes.SelectedValue);
        }

        /// <summary>
        /// Sucede cuando se cambia el item seleccionado de Proyectos
        /// Se tienen que cambiar los datasource de candidatos, carpetas y documentos
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void dropDownListProyectos_SelectedIndexChanged(object sender, EventArgs e)
        {
            Response.Redirect("Archivos.aspx?idCliente=" + dropDownListClientes.SelectedValue
                                    + "&idProyecto=" + dropDownListProyectos.SelectedValue);
        }

        /// <summary>
        /// Sucede cuando se cambia el item seleccionado de sitios
        /// Se tienen que cambiar los datasource de candidatos, carpetas y documentos
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void dropDownListSitios_SelectedIndexChanged(object sender, EventArgs e)
        {
            Response.Redirect("Archivos.aspx?idCliente=" + dropDownListClientes.SelectedValue
                                    + "&idProyecto=" + dropDownListProyectos.SelectedValue
                                    + "&idSitio=" + dropDownListSitios.SelectedValue);
        }

        /// <summary>
        /// Sucede cuando se cambia el item seleccionado de candidatos 
        /// se tiene que cambiar el datasource de carpetas y documentos
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void dropDownListCandidatos_SelectedIndexChanged(object sender, EventArgs e)
        {
            Response.Redirect("Archivos.aspx?idCliente=" + dropDownListClientes.SelectedValue
                                    + "&idProyecto=" + dropDownListProyectos.SelectedValue
                                    + "&idSitio=" + dropDownListSitios.SelectedValue
                                    + "&idCandidato=" + dropDownListCandidatos.SelectedValue);
        }

        #endregion

        #region METODOS PRIVATE DATA SOURCES CONTROLES

        /// <summary>
        /// Obtiene el data source de los clientes
        /// </summary>
        private void ObtenerDataSourceClientes()
        {
            dropDownListClientes.DataSource = null;
            string idCliente = ObtenerIdCliente((HttpContext.Current.Profile as ProfileBase));
            if (_administrador != null)
            {
                LinqDataSourceAdp adaptadorDataSourceSitios = new LinqDataSourceAdp();
                adaptadorDataSourceSitios = (LinqDataSourceAdp)_administrador.GetDataSourceClientes(idCliente);
                _linqDataSourceClientes = adaptadorDataSourceSitios.GetLinqDataSource();
                //Se configura el dropdownlist con el datasource
                dropDownListClientes.DataSource = _linqDataSourceClientes;
                dropDownListClientes.DataTextField = "Nombre";
                dropDownListClientes.DataValueField = "Id";

            }
            dropDownListClientes.DataBind();
            if (idCliente != string.Empty)
            {
                ListItem cliente = dropDownListClientes.Items.FindByValue(idCliente);
                if (cliente != null)
                    dropDownListClientes.SelectedValue = idCliente;
                dropDownListClientes.Visible = false;
                labelClientes.Visible = false;
                celdaDorpDownListCliente.Visible = false;
                celdaLabelCliente.Visible = false;
            }
            else
            {
                dropDownListClientes.Items.Insert(0, new ListItem("- - -", "- - -"));
                dropDownListClientes.SelectedIndex = 0;
                dropDownListClientes.Visible = true;
                labelClientes.Visible = true;
                celdaDorpDownListCliente.Visible = true;
                celdaLabelCliente.Visible = true;
            }
        }

        /// <summary>
        /// Obtiene el data source de los proyectos
        /// </summary>
        private void ObtenerDataSourceProyectos(string stringIdCliente)
        {
            dropDownListProyectos.Items.Clear();
            ListItemCollection datasource = GetDataSourceProyectos(stringIdCliente);
            for(int i=0; i< datasource.Count;i++ )
            {
                dropDownListProyectos.Items.Add(datasource[i]);
            }

            dropDownListProyectos.Items.Insert(0, new ListItem("- - -", "- - -"));
            dropDownListProyectos.SelectedIndex = 0;
        }



        /// <summary>
        /// Obtiene el data source de sitios
        /// </summary>
        private void ObtenerDataSourceSitios(string stringIdProyecto)
        {
            dropDownListSitios.DataSource = null;
            dropDownListSitios.Items.Clear();
            if (_administrador != null)
            {
                //Se le pide el data source al administrador 
                ListItemCollection datasource = _administrador.GetDataSourceSitios(stringIdProyecto);
                for (int i = 0; i < datasource.Count; i++)
                {
                    dropDownListSitios.Items.Add(datasource[i]);
                }
            }
            dropDownListSitios.Items.Insert(0, new ListItem("- - -", "- - -"));
            dropDownListSitios.SelectedIndex = 0;
        }

        /// <summary>
        /// Obtiene el data source de candidatos
        /// </summary>
        private void ObtenerDataSourceCandidatos(string stringIdSitio, string stringIdProyecto)
        {
            dropDownListCandidatos.DataSource = null;
            dropDownListCandidatos.Items.Clear();
            if (stringIdSitio != null && stringIdSitio != "- - -")
            {
                ListItemCollection datasource = _administrador.GetDataSourceCandidatos(stringIdSitio, stringIdProyecto);
                for (int i = 0; i < datasource.Count; i++)
                {
                    dropDownListCandidatos.Items.Add(datasource[i]);
                }
            }
            dropDownListCandidatos.Items.Insert(0, new ListItem("- - -", "- - -"));
            dropDownListCandidatos.SelectedIndex = 0;
        }

        /// <summary>
        /// Obtiene el data source de carpetas y documentos
        /// </summary>
        private void ObtenerDataSourceArchivosUpload(string stringIdCandidato, string stringIdProyecto, string stringIdCliente)
        {
            _fabricaLinqDataSource = new FabricaLinqDataSource();
            //Se pasa el administrador a cada uno de los controles de manejo de archivos
            if (_fabricaLinqDataSource != null)
            {
                EntidadLinqDataContext contexto = new EntidadLinqDataContext();
                _administrador = new Administrador(_fabricaLinqDataSource, contexto);
            }

            //Solo si hay seleccionado un id de candidato se muestra el control con los documentos
            if (stringIdCandidato != null && stringIdCandidato != "- - -")
            {
                string nombreCarpetaBase = "CarpetaBase_" + stringIdCliente + "_" + stringIdProyecto; 
                
                _controlDocumentacionCarpetas.Visible = true;


                _controlDocumentacionCarpetas.CambiarValoresCarpeta(stringIdCandidato, stringIdProyecto, nombreCarpetaBase, _administrador);
            }
            else
            {
                _controlDocumentacionCarpetas.Visible = false;
            }
        }

        /// <summary>
        /// Obtiene el id del cliente
        /// </summary>
        /// <returns>Retorna el id del cliente al que pertenece el usuario o null si no es de ningun clente sino de ingenieria</returns>
        private string ObtenerIdCliente(ProfileBase usuarioProfile)
        {
            //ProfileBase usuarioProfile = HttpContext.Current.Profile as ProfileBase;
            string tipoUsuario = (string)usuarioProfile.GetPropertyValue("TipoUsuario");

            string idCliente = string.Empty;
            if (tipoUsuario.StartsWith("Cliente_"))
            {
                idCliente = tipoUsuario.Split(new char[1] { '_' })[1];
            }
            if (idCliente != string.Empty)
            {
                return idCliente;
            }
            else
            {
                return string.Empty;
            }

        }
        /// <summary>
        /// Obtiene el datasource de los proyectos
        /// </summary>
        /// <param name="idCliente"></param>
        /// <returns></returns>
        private ListItemCollection GetDataSourceProyectos(string idCliente)
        {
            ListItemCollection resultado = new ListItemCollection();
            AdministradorProyectos adminProyectos = new AdministradorProyectos(new FabricaLinqDataSource(), new EntidadLinqDataContext());

            //se traen los roles del usuario actual
            string[] rolesUsuario = Roles.GetRolesForUser();
            //se seleccionan todos los roles que tengan tres substrings partiendolos por '_'. Según
            //la convención establecida estos roles solo pueden ser los roles de proyecto.
            //NOTA: si la convención cambia por alguna razón esta parte del código también debe modificarse
            List<string> rolesProyectos = rolesUsuario.ToList().FindAll(x => x.Split(new char[1] { '_' }).Length == 3);

            foreach (string rolProyecto in rolesProyectos)
            {
                string idClienteRolProyecto = rolProyecto.Split(new char[1] { '_' })[1];
                string idProyectoRolProyecto = rolProyecto.Split(new char[1] { '_' })[2];

                string nombreProyectoRolProyecto = adminProyectos.GetNombreProyectoById(new Guid(idProyectoRolProyecto));

                if (nombreProyectoRolProyecto != null && idClienteRolProyecto == idCliente)
                    resultado.Add(new ListItem(nombreProyectoRolProyecto, idProyectoRolProyecto));
                //listadoProyectos.Items.Add(new ListItem(nombreProyectoRolProyecto, "ReporteProyecto.aspx?idProyecto=" + idProyectoRolProyecto));


            }
            return resultado;
        }


        #endregion
    }
}